<?php
namespace Api\Common;
use Think\Controller\RestController;
use Think\Pager;
//请求类型错误返回code
define("ERROR_REQUEST_CODE", "303");
//请求时token错误返回code
define("ERROR_TOKEN_CODE", "302");
//请求数据错误返回code
define("ERROR_DATA_CODE", "304");
//成功返回code
define("SUCCESS_CODE", "200");
//请求成功 数据返回 格式 默认 为json  返回的数据 放入到data里面
//{"code"=>200,"data":{"list":"listValue","otherData":"otherDataValue"},"msg":"请求成功提示，可以不传"}

//请求时验证数据 非200时  data 可以不返回
//{"code"=>303,"msg":"请求类型有误"}

class BaseController extends  RestController {
    //规定请求类型
   public $requestType="post";
    //是否登录
    public $is_login=true;
    //用户id
    public $user_id;
    //请求的参数
    public $params;
    //初始化调用
	public function _initialize(){
		//跨域
		header("Access-Control-Allow-Origin:*");
	    header("Access-Control-Allow-Headers:X-Requested-With");
	    $method=$this->_method;

	    //默认方法可以在子类中 重写该方法   用于初始化操作 如$requestType，$is_login的初始化
	    $this->init();
	    //请求类型为post 就用post接收
	    if($this->requestType=="get"){
            if($method==$this->requestType){
                $this->filterParams($_GET);
            }else{
                $this->response(['code'=>ERROR_REQUEST_CODE,'msg'=>'请求类型必须为get']);
            }
        }

        if($this->requestType=="post" ){
            if($method==$this->requestType){
                $this->filterParams($_POST);
            }else{
                $this->response(['code'=>ERROR_REQUEST_CODE,'msg'=>'请求类型必须为post']);
            }
        }
        if($this->requestType=="post|get"){
            if($method=="get"){
                $this->filterParams($_GET);
            }elseif($method=="post"){
                $this->filterParams($_POST);
            }else{
                $this->response(['code'=>ERROR_REQUEST_CODE,'msg'=>'请求类型必须为post或者get']);
            }
        }
	}

    /****
     * 重写父类 response方法
     * @param mixed $data
     * @param string $type
     * @param int $code
     */
	public function response($data, $type = '', $code = 200)
    {
        if(empty($type)){
            $type="json";
        }
        parent::response($data, $type, $code); // TODO: Change the autogenerated stub
    }
    //过滤请求参数
	protected function filterParams($params){
	    //需要登录  就需要验证token
        $data=json_decode($params['data'],true);
        if($this->is_login){
            $token=$params['token'];
            if(empty($token)){
                $token=$data['token'];
            }
            if($this->checkToken($token)){
                $this->response(['code'=>ERROR_REQUEST_CODE,'msg'=>'请求类型必须为post或者get']);
            }
            $this->params=$data;
        }else{
            $this->params=$data;
        }
    }

    public function checkToken($token){
        $result = M('auth_token')->where("token='".$token."'")->find();
        if(!empty($result)){
            if($result['duetime']<time()){
                $this->response(['code'=>ERROR_TOKEN_CODE,'msg'=>'Token已过期，请重新登录']);
            }
            //是否是记住密码 如果是记住密码 则 不更新时间
            if($result['is_update']==1){
                M('auth_token')->where("token='".$token."'")->save([
                    'duetime'=>time()+$result['expires_in']
                ]);
            }
            $this->user_id=$result['user_id'];
        }else{
            $this->response(['code'=>ERROR_TOKEN_CODE,'msg'=>'Token不存在或者已过期']);
        }
    }

    /***
     * 登录时 获取token
     * @return string
     */
    protected function getToken(){
        if(session_status() !== PHP_SESSION_ACTIVE) {
            @session_start();
        }
        @session_regenerate_id();
        $sid = session_id();
        @session_destroy();
        return md5($sid);
    }

    /***
     * @param $key 参数key
     * @param bool $required  是否验证必填
     */
    public function getParams($key,$required=false){
        $params=$this->params;
        if($required){
            if(!empty($params[$key])){
                return $params[$key];
            }else{
                $this->response(["code"=>ERROR_DATA_CODE,"msg"=>"参数：".$key."必须填写"]);
            }
        }else{
            return $params[$key];
        }

    }

    /***
     * 获取用户信息
     * @return mixed
     */
    public function getUser(){
        return M('user')->find($this->user_id);
    }

    /***
     * 初始化方法  误删
     */
    protected function init(){

    }
    
    /* 
     * 失败的时候数据返回
     * $msg 错误响应的文字描述
     *  */
    public function responseError($msg){
        $data = array(
            'code' => 1,
            'msg' => $msg,
            'data' => null,
        );
        return $data;
    }
    
    /*
     * 失败的时候数据返回
     * $msg 成功响应的文字描述
     * $data 响应的数据
     *  */
    public function responseSuccess($data,$msg=""){
        $data = array(
            'code' => 0,
            'msg' => $msg,
            'data' => $data,
        );
        return $data;
    }
}
?>